
package com.hjk.common.response.wrapper;


import com.fasterxml.jackson.annotation.JsonInclude;
import com.hjk.common.page.PageUtil;
import lombok.Data;

/**
 * 分页响应
 *
 * @author huangjunkai
 * @date 2020年11月20日10:55:12
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PageR<T> extends R<T> {

    private static final long serialVersionUID = 666985064788933395L;

    private PageUtil pageUtil;


    /**
     * Instantiates a new Page wrapper.
     */
    PageR() {
        super();
    }


    /**
     * Instantiates a new Page wrapper.
     *
     * @param code    the code
     * @param message the message
     */
    public PageR(int code, String message) {
        super(code, message);
    }

    /**
     * Instantiates a new pageWrapper default code=200
     *
     * @param result   the result
     * @param pageUtil the page util
     */
    public PageR(T result, PageUtil pageUtil) {
        super();
        this.setResult(result);
        this.setPageUtil(pageUtil);
    }

    /**
     * Instantiates a new Page wrapper.
     *
     * @param code     the code
     * @param message  the message
     * @param result   the result
     * @param pageUtil the page util
     */
    PageR(int code, String message, T result, PageUtil pageUtil) {
        super(code, message, result);
        this.pageUtil = pageUtil;
    }

    /**
     * Sets the 分页数据 , 返回自身的引用.
     *
     * @param pageUtil the page util
     * @return the page wrapper
     */
    public PageR<T> pageUtil(PageUtil pageUtil) {
        this.setPageUtil(pageUtil);
        return this;
    }

    /**
     * Sets the 结果数据 , 返回自身的引用.
     *
     * @param result the result
     * @return the page wrapper
     */
    @Override
    public PageR<T> result(T result) {
        super.setResult(result);
        return this;
    }


    private static <E> PageR<E> wrap(int code, String message, E o, PageUtil pageUtil) {
        return new PageR<E>(code, message, o, pageUtil);
    }



    /**
     * Wrap.
     *
     * @param <E>     the type parameter
     * @param code    the code
     * @param message the message
     * @return the page wrapper
     */
    public static <E> PageR<E> wrap(int code, String message) {
        return wrap(code, message, null, null);
    }

    /**
     * Wrap.
     *
     * @param <E>  the type parameter
     * @param code the code
     * @return the page wrapper
     */
    public static <E> PageR<E> wrap(int code) {
        return wrap(code, null, null, null);
    }



    /**
     * Un wrapper.
     *
     * @param <E>     the type parameter
     * @param wrapper the wrapper
     * @return the e
     */
    public static <E> E unWrap(PageR<E> wrapper) {
        return wrapper.getResult();
    }




    /**
     * Wrap SUCCESS. code=200
     *
     * @param <E> the type parameter
     * @return the page wrapper
     */
    public static <E> PageR<E> ok() {
        return new PageR<E>();
    }
}
